Ubicación Estaciones Metereológicas

Contents

Ubicación Estaciones Metereológicas#




# Load libraries
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Load sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error
import plotly.express as px

import warnings
warnings.filterwarnings("ignore")
df = pd.read_csv("data_2017_2022.csv", sep=";")
df_1 = df.copy()
df_1["medicion"]=df_1["medicion"].str.replace(",", ".").astype("float") # convertir variable medición a númerica
df_1['fecha'] = pd.to_datetime(df_1['fecha']) # convertir variable fecha a datatime
df_1 = df_1.pivot(index=["fecha", "estacion"],columns= "variable", values="medicion").reset_index()

Para más practicidad se renombran las variables de nuestro conjunto de datos.

df_1 = df_1.rename(columns={    
    'variable': 'var',
    'black_carbon': 'BC',
    'direccion_viento': 'WD',
    'humedad': 'HR',
    'lluvia': 'RF',
    'presion': 'P',
    'radiacion_solar': 'RS',
    'temperatura': 'AT',
    'temperatura_10_m': 'AT_10_m',
    'uv-pm': 'UV',
    'velocidad_viento': 'WS',
    'h2s': 'H2S',
    'no2': 'NO2',
    'o3': 'O3',
    'so2': 'SO2',
    'pm10': 'PM10',
    'pm25': 'PM2.5'  
})

A continuación visualizamos nuestros datos a tráves de la función head()

df_t = df_1.copy()
df_t = df_t.drop(columns=["NO2", "BC", "HR", "RF", "P", "RS", "AT", "AT_10_m", "UV", "WS", "H2S", "O3", "SO2", "PM2.5"])
df_t = df_t.dropna(subset=['PM10'])

df_t.info()
print(df_t["estacion"].unique())
<class 'pandas.core.frame.DataFrame'>
Index: 234568 entries, 1 to 463530
Data columns (total 4 columns):
 #   Column    Non-Null Count   Dtype              
---  ------    --------------   -----              
 0   fecha     234568 non-null  datetime64[ns, UTC]
 1   estacion  234568 non-null  object             
 2   WD        126024 non-null  float64            
 3   PM10      234568 non-null  float64            
dtypes: datetime64[ns, UTC](1), float64(2), object(1)
memory usage: 8.9+ MB
['canaveralejo' 'compartir' 'era_obrero' 'ermita' 'flora' 'pance'
 'transitoria' 'univalle']

Mapa de Cali#

pd.set_option('display.precision', 4)
# Definir el diccionario de coordenadas
coords = {
    'base_aerea': {'Latitud': 3.4343, 'Longitud': -76.5226},
    'canaveralejo': {'Latitud': 3.4267, 'Longitud': -76.5239},
    'compartir': {'Latitud': 3.4295, 'Longitud': -76.5384},
    'era_obrero': {'Latitud': 3.4045, 'Longitud': -76.5525},
    'ermita': {'Latitud': 3.4352, 'Longitud': -76.5416},
    'flora': {'Latitud': 3.4350, 'Longitud': -76.5160},
    'pance': {'Latitud': 3.4060, 'Longitud': -76.5780},
    'transitoria': {'Latitud': 3.4355, 'Longitud': -76.5371},
    'univalle': {'Latitud': 3.4189, 'Longitud': -76.5641}
}

# Agregar las columnas de Latitud y Longitud al DataFrame df_t
df_t['Latitud'] = df_t['estacion'].map(lambda x: coords[x]['Latitud'])
df_t['Longitud'] = df_t['estacion'].map(lambda x: coords[x]['Longitud'])
import plotly.graph_objects as go
import pandas as pd

# Define los intervalos, colores y clasificaciones
def get_color_and_classification(pm10):
    if pm10 <= 50:
        return 'green', 'Bueno'
    elif pm10 <= 100:
        return 'yellow', 'Aceptable'
    elif pm10 <= 150:
        return 'orange', 'Dañina a la salud grupos sensibles'
    elif pm10 <= 200:
        return 'red', 'Daño a la salud'
    elif pm10 <= 300:
        return 'purple', 'Muy dañino a la salud'
    elif pm10 <= 500:
        return 'brown', 'Peligroso'
    else:
        return 'grey', 'Extremadamente peligroso'

# Calcula estadísticas de PM10
df_stats = df_t.groupby('estacion').agg({
    'PM10': ['mean']
}).reset_index()

# Renombra las columnas para mayor claridad
df_stats.columns = ['estacion', 'PM10_Media']

# Añadir columnas de color y clasificación basadas en la media de PM10
df_stats[['Color', 'Clasificacion']] = df_stats.apply(lambda row: pd.Series(get_color_and_classification(row['PM10_Media'])), axis=1)

# Une los datos estadísticos con el DataFrame de coordenadas
df_t_merged = df_t.merge(df_stats[['estacion', 'Color', 'Clasificacion', 'PM10_Media']], on='estacion')

# Crear el mapa
mapa = go.Figure()

# Agregar marcadores para cada estación
mapa.add_trace(go.Scattermapbox(
    lat=df_t_merged['Latitud'],
    lon=df_t_merged['Longitud'],
            mode='markers',
            marker=dict(
            size=15,
            color=df_t_merged['Color'],
            symbol ="circle",
    ),
    text=df_t_merged['estacion'],
    textposition='top center',
    customdata=df_t_merged[['PM10_Media', 'Clasificacion']],
    hovertemplate=
    '<b>Estación:</b> %{text}<br>' +
    '<b>Clasificación:</b> %{customdata[1]}<br>' +
    '<b>Media PM10:</b> %{customdata[0]:.2f} µg/m³<br>' +
    '<extra></extra>'
))

# Configuración del mapa
mapa.update_layout(
    mapbox=dict(
        style="open-street-map",
        zoom=11,
        center=dict(lat=df_t_merged['Latitud'].mean(), lon=df_t_merged['Longitud'].mean()),
    ),
    title="Ubicación de Estaciones Meteorológicas en Cali",
    title_x=0.5,
    height=600,
    margin={"r":0,"t":40,"l":0,"b":0}
)

# Mostrar el mapa
mapa.show()